package com.zijin.config;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.zijin.context.BaseContext;
import com.zijin.utils.SnowflakeIdGeneratorUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;
import java.time.LocalDateTime;

/**
 * @Title: MyBatisPlus
 * @Author JWei Xu
 * @Package com.zijin.config
 * @Date 2024/12/6 21:53
 * @description:
 */

@Slf4j
@Configuration
public class MyBatisPlusConfig {

    @Autowired
    SnowflakeIdGeneratorUtil snowflakeIdGeneratorUtil;


    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        interceptor.addInnerInterceptor(paginationInnerInterceptor());
        // 乐观锁插件
        interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
        // 阻断插件
//		interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
        return interceptor;
    }

    /**
     * 分页插件，自动识别数据库类型
     * https://baomidou.com/guide/interceptor-pagination.html
     */
    public PaginationInnerInterceptor paginationInnerInterceptor() {
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 设置数据库类型为mysql
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        // 设置最大单页限制数量，默认 500 条，-1 不受限制
        paginationInnerInterceptor.setMaxLimit(-1L);
        return paginationInnerInterceptor;
    }

    /**
     * 乐观锁插件
     * https://baomidou.com/guide/interceptor-optimistic-locker.html
     */
    public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
        return new OptimisticLockerInnerInterceptor();
    }


    @Bean
    public MetaObjectHandler metaObjectHandler() {
        return new MetaObjectHandler() {

            @Override
            public void insertFill(MetaObject metaObject) {

                Long currentId = BaseContext.getCurrentId();
                if ( currentId != null) {
                    this.setFieldValByName("updateBy",currentId,metaObject);
                    this.setFieldValByName("createBy",currentId,metaObject);


                }
//                this.setFieldValByName("id",snowflakeIdGeneratorUtil.nextId(),metaObject);
                this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
                this.setFieldValByName("createTime", LocalDateTime.now(),metaObject);
                this.setFieldValByName("isDelete", 0,metaObject);
            }
            @Override
            public void updateFill(MetaObject metaObject) {
                Long currentId = BaseContext.getCurrentId();
                if ( currentId != null) {
                    this.setFieldValByName("updateBy",currentId,metaObject);

                }
                this.setFieldValByName("updateTime",LocalDateTime.now(),metaObject);
            }
        };
    }




}
